// 认证中间件
// 检查逻辑：
// 1. 检查header是否有token
// 2. 如果有， 解析token看是否过期，或是否是有效
// 3. 如果是有效，放行

import { signVerify } from "app/utils/auth";
import { Context, Next } from "koa";

function AuthMiddleware(ctx: Context, next: Next) {
    // 忽略一些不需要授权的url
    if (ctx.path == "/api/user/login") {
        return next();
    }

    const token: any = ctx.header['token'];
    if (token) {
        // 有
        const {decoded, error} = signVerify(token);
        console.log("deocded:", decoded, error)
        if (error) {
            if (error.name === 'TokenExpiredError') {
                // 过期了
                return ctx.body = {
                    code: 4001,
                    msg: "您过期了，请重登录"
                }
                // 扩展 如果仅过期5分钟以内，根据旧token生成新的token
                // 如果超过5分钟，则提示过期
            } else {
                // 无效的token
                return ctx.body = {
                    code: 4002,
                    msg: 'token无效'
                }
            }
        }
        ctx.state.user = decoded.payload;  // 是之前加密进去的jwt
        return next();
    } else {
        // 无
        ctx.body = {
            code: 4000,
            msg: "没有token"
        }
    }
}

export default AuthMiddleware
